package com.swak.paxos;

import java.util.List;
import java.util.Set;
import java.util.concurrent.CompletableFuture;

import com.swak.paxos.PaxosConfig.GroupConfig;
import com.swak.reactivex.cluster.Member;
import com.swak.reactivex.transport.Message;

/**
 * Group 代表一个业务线。
 * 
 * @author 618lf
 */
public interface Group {

	/**
	 * Group Id.
	 * 
	 * @return
	 */
	int getGroupID();

	/**
	 * 是否是 Follower 节点
	 * 
	 * @return
	 */
	boolean isIMFollower();

	/**
	 * 是否是 Master 节点
	 * 
	 * @return
	 */
	boolean isIMMaster();

	/**
	 * 返回 Follower节点
	 * 
	 * @return
	 */
	Set<String> getFollowers();

	/**
	 * 提交一个值.
	 * 
	 * @param value 提交的值
	 * @return 异步结果
	 */
	CompletableFuture<Void> propose(Value value);

	/**
	 * 提交一个值.
	 * 
	 * @param value 提交的值
	 * @return 异步结果
	 */
	CompletableFuture<Void> propose(Value value, boolean useMaster);

	/**
	 * 节点变化
	 * 
	 * @param member
	 * @param members
	 * @param add
	 */
	void onMemberShipChanaged(Member member, GroupConfig config, List<Member> members, boolean add);

	/**
	 * 接收消息
	 * 
	 * @param message 接收到的消息
	 */
	void onReceiveMessage(Message message);

	/**
	 * 关闭
	 */
	void close();

	/**
	 * 在 Eventloop 中处理
	 * 
	 * @author 618lf
	 */
	interface Unsafe {

		void onMemberShipChanaged(Member member, GroupConfig config, List<Member> members, boolean add);

		void onReceiveMessage(Message message);
	}
}
